package Day_0216.JVM.GarbageCollection;

/**
 * @author zxc
 * @date 2023/02/16 11:26
 **/
public class Garbage_Collection_Algorithm {
    public static void main(String[] args) {
        /**
         * 谈一谈对于垃圾收集算法的理解
         * ===》
         * 1.GC最基础的算法有三类： 标记 -清除算法、复制算法、标记-压缩算法，
         * 我们常用的垃圾回收器一般都采用分代收集算法。
         *
         * 2.标记 -清除算法，“标记-清除”（Mark-Sweep）算法，如它的名字一样，
         * 算法分为“标记”和“清除”两个阶段：
         * （1）首先，标记出所有需要回收的对象;
         * （2）在标记完成后统一回收掉所有被标记的对象。
         *
         * 3.复制算法，“复制”（Copying）的收集算法，
         * （1）将可用内存,按容量划分为大小相等的两块，每次只使用其中的一块。
         * （2）当这一块的内存用完了，就将还存活着的对象复制到另外一块上面，
         * （3）然后,再把已使用过的内存空间一次清理掉。
         *
         * 4.标记-压缩算法，标记过程仍然与“标记-清除”算法一样，但后续步骤不是直接对可回收对象进行清理，
         * （1）让所有存活的对象都向一端移动，
         * （2）然后，直接清理掉端边界以外的内存
         *
         * 5.分代收集算法，“分代收集”（Generational Collection）算法，
         * （1）把Java堆分为新生代和老年代，这样就可以根据各个年代的特点采用最适当的收集算法
         * （2）一般情况下，新生代使用 复制算法，老年代使用 标记压缩算法;
         *
         */

        /**
         * 谈一谈对于标记-清除算法的理解
         * ===》
         * 1.标记-清除算法 ：标记无用对象，然后进行清除回收。
         * 2.标记-清除算法（Mark-Sweep）是一种常见的基础垃圾收集算法，它将垃圾收集分为两个阶段：
         * （1）标记阶段：标记出可以回收的对象。
         * （2）清除阶段：回收被标记的对象所占用的空间。
         *
         * 3.标记-清除算法之所以是基础的，是因为后面讲到的垃圾收集算法，都是在此算法的基础上进行改进的。
         * （1）优点：实现简单，不需要对象进行移动。
         * （2）缺点：标记、清除过程效率低，产生大量不连续的内存碎片，提高了垃圾回收的频率。
         *
         */

        /**
         * 谈一谈对于复制算法的理解
         * ===》
         * 1.复制算法
         * 为了解决 标记-清除算法的效率不高的问题，产生了复制算法。
         * （1）它把内存空间划为两个相等的区域，
         * （2）每次只使用其中一个区域。
         * （3）垃圾收集时，遍历当前使用的区域，把存活对象复制到另外一个区域中，
         * （3）最后，将当前使用区域的所有对象进行回收。
         *
         * 2.复制算法的优缺点 ：
         * （1）优点：按顺序分配内存即可，实现简单、运行高效，不用考虑内存碎片。
         * （2）缺点：可用的内存大小缩小为原来的一半，对象存活率高时会频繁进行复制。
         *
         */

        /**
         * 谈一谈对于标记-整理算法的理解
         * ===》
         * 1.在新生代中可以使用复制算法，但是在老年代就不能选择复制算法了，
         * 因为老年代的对象存活率会较高，这样会有较多的复制操作，导致效率变低。
         *
         * 2.标记-清除算法可以应用在老年代中，但是它效率不高，在内存回收后容易产生大量内存碎片。
         * 因此就出现了一种标记-整理算法（Mark-Compact）算法，
         *
         * 3.与标记-清除算法不同的是，在标记可回收的对象后，
         * 将所有存活的对象压缩到内存的一端，使他们紧凑的排列在一起，
         * 然后对端边界以外的内存进行回收。回收后，已用和未用的内存都各自一边。
         *
         * 4.标记-整理算法的优缺点
         * （1）优点：解决了标记-清理算法存在的内存碎片问题。
         * （2）缺点：仍需要进行局部对象移动，一定程度上降低了效率。
         *
         */
    }
}
